<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //js中专门提供了一些函数方法来处理函数内部this的指向问题，bind()\call() apply()
        
        //call()方法可以调用一个对象也可以改变函数的this指向
        // fun.call(thisArg,arg1,arg2...);
        var o = {
            name: 'andy'
        }
        function fn(a,b){
            console.log(this);
            console.log(a+b);
        }
        fn.call();
        fn.call(o);
        fn.call(o,1,2);
        //call()的主要作用是用来实现继承
        function Father(uname,age){
            this.uname = uname;
            this.age  = age;
        }
        function Son(uname,age){
            Father.call(this,uname,age);
        }
        var son = new Son("刘德华",'18');
        console.log(son);
        

        //apply()方法
        // apply()方法调用一个函数，改变this指向
        // fun.apply(thisArg,[argsArray])
        /*thisArg:在fun函数运行时指定的this值
        argsArray：传递的值，必须包含在数组里面
        返回值就是函数的返回值，因为它就是调用函数 返回的是字符串形式*/
        function Father1(uname,age){
            this.uname = uname;
            this.age  = age;
        }
        function Son1(uname,age){
            Father1.apply(this,[uname,age]);
        }
        var son1 = new Son1("刘德华",'18');
        console.log(son1);
        //apply()的主要应用  利用apply借助于数学内置对象求最大值
        //Math.max();
        var arr = [2,58,32,69,45,6];
        console.log(Math.max.apply(Math,arr));
        console.log(Math.min.apply(Math,arr));

        //bind()方法不会调用函数，但是能改变函数内部的this指向
        //语法: fun.bind(thisArg,arg1,arg2,....)
        //thisArg ：在fun函数运行时指定的this值
        //arg1，arg2：传递的其他参数
        //返回由指定的this值和初始化参数改造的原函数拷贝
        var o ={
            name:'andy'
        };
        function fn(){
            console.log(this);
        };
        var f = fn.bind(o);//bind()方法不会调用函数，但是能改变函数内部的this指向
        f();//返回由指定的this值和初始化参数改造的原函数拷贝
    </script>
</body>
</html>